package com.rookie.im.learn.io.netty.protocol.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.util.CharsetUtil;

import java.util.List;

public class MyDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 可读取字节数至少一个字节(整数)
        if (byteBuf.readableBytes() < 4) {
            list.add(byteBuf);
            return;
        }
        // 标记读取索引
        byteBuf.markReaderIndex();
        // 读取第一个整数,作为数据长度
        int length = byteBuf.readInt();
        // 后续数据长度不足
        if (length <= 0 || byteBuf.readableBytes() < length) {
            // 重置索引
            byteBuf.resetReaderIndex();
            list.add(byteBuf);
            return;
        }
        System.out.println(length);
        byte[] data = new byte[length];
        // 读取length个字节
        byteBuf.readBytes(data);
        String msg = new String(data, CharsetUtil.UTF_8);
        System.out.println(msg);
        // 将数据向下传递
        list.add(msg);
    }
}
